<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>标题</title>
</head>

<body>
    <script>
        /*  
            1. 利用数组的下标进行排序
            2. 适合数字范围不是很大的排序
             [2,2,3,5,1,4]
             [0,0,0,0,0,0]
             [0,1,2,1,1,1]
             [0,1,2,2,3,4,5]
            3. 时间复杂度 O(N+K) 空间复杂度O(N)
            4. 不适合小数 不适合最小值和最大值差距过大的情况
            5. 占用额外空间 不是原地排序
        */
        function sortArray(nums) {
            // 1. 找到数组中最大值和最小值
            let max = nums[0]
            let min = nums[0]
            for (let i = 0; i < nums.length; i++) {
                if (nums[i] > max) {
                    max = nums[i]
                } else if (nums[i] < min) {
                    min = nums[i]
                }
            }
            // 2. 计算范围并初始化计数数组
            let sub = max - min
            let array = new Array(sub + 1).fill(0)
            // 3. 填充计数数组
            for (let i = 0; i < nums.length; i++) {
                array[nums[i] - min]++
            }
            // 4. 根据计数数组生成排序结果
            let result = []
            for (let i = 0; i < array.length; i++) {
                for (let j = 0; j < array[i]; j++) {
                    result.push(min + i)
                }
            }
            return result
        }
        console.log(sortArray([94, 90, 95, 95, 99]));
        console.log(sortArray([2, 2, 3, 3, 5, 4, 1]));
    </script>
</body>

</html>